package com.hqy.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hqy.product.dto.BaseCategoryView;
import com.hqy.product.dto.SkuImage;
import com.hqy.product.dto.SkuInfo;
import com.hqy.product.dto.SpuSaleAttr;
import com.hqy.product.mapper.*;
import com.hqy.product.service.ItemService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

@Service
public class ItemServiceImpl implements ItemService {
    @Resource
    private SkuInfoMapper skuInfoMapper;

    @Resource
    private BaseCategoryViewMapper baseCategoryViewMapper;

    @Resource
    private SkuImageMapper skuImageMapper;

    @Resource
    private SpuSaleAttrMapper spuSaleAttrMapper;

    @Resource
    private SkuSaleAttrValueMapper skuSaleAttrValueMapper;



    /**
     * 根据sku的id查询sku的详细信息
     *
     * @param skuId
     * @return
     */
    @Override
    public SkuInfo getSkuInfo(Long skuId) {
        return skuInfoMapper.selectById(skuId);
    }

    /**
     * 根据三级分类的id获取一级二级三级分类的详细信息
     *
     * @param c3Id
     * @return
     */
    @Override
    public BaseCategoryView getCategory(Long c3Id) {
        return baseCategoryViewMapper.selectById(c3Id);
    }

    /**
     * 根据sku的id查询图片的列表
     *
     * @param skuId
     * @return
     */
    @Override
    public List<SkuImage> getSkuImage(Long skuId) {
        return skuImageMapper.selectList(
                new LambdaQueryWrapper<SkuImage>()
                        .eq(SkuImage::getSkuId, skuId));
    }

    /**
     * 根据sku的id查询价格
     *
     * @param skuId
     * @return
     */
    @Override
    public BigDecimal getPrice(Long skuId) {
        return skuInfoMapper.selectById(skuId).getPrice();
    }

    /**
     * 查询商品详情页使用的展示销售属性的信息,并且标识出当前的sku的销售属性值是哪个
     *
     * @param skuId
     * @param spuId
     * @return
     */
    @Override
    public List<SpuSaleAttr> getSaleAttrBySkuIdAndSpuId(Long skuId, Long spuId) {
        return spuSaleAttrMapper.selectSaleAttrBySkuIdAndSpuId(skuId, spuId);
    }

    /**
     * 获取指定spu下的所有sku的id和销售属性值的键值对
     *
     * @param spuId
     * @return
     */
    @Override
    public Map getSkuKeyAndValues(Long spuId) {
        //查询列表
        List<Map> maps = skuSaleAttrValueMapper.selectSkuKeyAndValues(spuId);
        //初始化返回结果
        Map result = new ConcurrentHashMap();
        //循环遍历
        maps.stream().forEach(map -> {
            //获取sku的id
            Object skuId = map.get("sku_id");
            //获取values的值的组合
            Object valuesId = map.get("values_id");
            //保存
            result.put(valuesId, skuId);
        });
        return result;
    }

    /**
     * 获取首页的分类信息
     *
     * @return
     */
    @Override
    public List<JSONObject> getIndexCategory() {
        //查询所有一级二级三级分类的信息----视图
        List<BaseCategoryView> categoryViewList1 =
                baseCategoryViewMapper.selectList(null);
        //开始以一级分类为单位进行分桶: Map<key=每一个一级分类的id, value= List<每一个一级分类对应的列表>>
        Map<Long, List<BaseCategoryView>> categoryViewMap1 =
                categoryViewList1.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
        //初始化一级分类的list对象
        List<JSONObject> category1JsonList = new ArrayList<>();
        //遍历这个一级分类的map
        for (Map.Entry<Long, List<BaseCategoryView>> category1Entry : categoryViewMap1.entrySet()) {
            //初始化
            JSONObject jsonObject1 = new JSONObject();
            //一级分类的id= 1
            Long category1Id = category1Entry.getKey();
            jsonObject1.put("categoryId", category1Id);
            //获取对应的value:分类中凡是一级分类id为当前一级分类的所有二级和三级分类的信息
            List<BaseCategoryView> categoryViewList2 = category1Entry.getValue();
            //获取一级分类的名字
            String category1Name = categoryViewList2.get(0).getCategory1Name();
            jsonObject1.put("categoryName", category1Name);
            //以二级分类进行分桶key=二级分类的id, value=每个二级分类对应三级分类的列表(不重复)
            Map<Long, List<BaseCategoryView>> categoryViewMap2 =
                    categoryViewList2.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            //这个一级分类对应的所有二级分类
            List<JSONObject> category2JsonList = new ArrayList<>();
            //二级分类分桶后的categoryViewMap2进行遍历
            for (Map.Entry<Long, List<BaseCategoryView>> category2Entry : categoryViewMap2.entrySet()) {
                //初始化
                JSONObject jsonObject2 = new JSONObject();
                //二级分类的id
                Long category2Id = category2Entry.getKey();
                jsonObject2.put("categoryId", category2Id);
                //获取这个二级分类对应的三级分类的列表categoryViewList3,这个一级和二级分类下的三级分类的信息
                List<BaseCategoryView> categoryViewList3 = category2Entry.getValue();
                //获取二级分类的名字
                String category2Name = categoryViewList3.get(0).getCategory2Name();
                jsonObject2.put("categoryName", category2Name);
                //获取所有三级分类的id和名字,包装为一个List<JSONObject--->(categoryId, categoryName)>
                List<JSONObject> category3JsonList = categoryViewList3.stream().map(baseCategoryView -> {
                    //初始化
                    JSONObject jsonObject3 = new JSONObject();
                    //获取三级分类的id
                    Long category3Id = baseCategoryView.getCategory3Id();
                    //获取三级分类的name
                    String category3Name = baseCategoryView.getCategory3Name();
                    //保存数据
                    jsonObject3.put("categoryId", category3Id);
                    jsonObject3.put("categoryName", category3Name);
                    //返回
                    return jsonObject3;
                }).collect(Collectors.toList());
                //保存这个二级分类和三级分类的一对多的关系
                jsonObject2.put("childCategory", category3JsonList);
                //保存一个二级分类
                category2JsonList.add(jsonObject2);
            }
            //这个一级分类的所有的二级分类的信息已经包装好了,保存这个一级和这些二级的对应关系
            jsonObject1.put("childCategory", category2JsonList);
            //列表中保存一个
            category1JsonList.add(jsonObject1);
        }
        //返回结果
        return category1JsonList;
    }
}
